/*
 * @Author: Fan Dong
 * @Date: 2021-06-22 10:19:39
 * @LastEditors: Fan Dong
 * @LastEditTime: 2021-06-24 09:57:35
 * @Description: 文件描述
 * @FilePath: \learn-typescript\ts\1.数据类型.ts
 */

// ts的数据类型

/*
  布尔类型（boolean）
  字符串类型（string）
  数字类型（number）
  数组类型（array）
  元组类型（tuple）
  枚举类型（enum）
  任意类型（any）
  null 和 undefined
  void类型
  never类型
*/

// 布尔类型（boolean） true  false

// let flag: boolean = true;

// 数字类型（number）

let a: number = 123;
a = 12.3;
// a="2ew" // 错误写法

// 字符串类型（string）
let str: string = "哈哈哈";
// 错误写法
// str= 12;
// str= false

// 数组类型（array） ts 中2中方式

// 1.第一种方式
let arr: number[] = [1, 2, 3, 4];
let arr4: any[] = [1, 2, "ff", 4, false];

console.log(arr, "arr");

// 2.第二种定义数组的方式
let arr2: Array<number> = [11, 22, 33];
let arr3: Array<string> = ["kakka", "kjakjk"];

console.log(arr2, "arr2");
console.log(arr3, "arr3");

// 元组类型（tuple） 属于数组的一种

let tuple: [string, number, boolean] = ["jj", 1234, false];

console.log(tuple, "tuple");

// 枚举类型（enum）
enum Flag {
  success = 1,
  error = -1,
}

let f: Flag = Flag.error;
console.log(f);
console.log(Flag.success);

enum Color {
  red,
  blue,
  orange,
}
// 如果没赋值，就默认是索引值
let r: Color = Color.red;
let b: Color = Color.blue;
console.log(r, b);

// 如果没赋值，且上一个有值，默认值为上一个的值+1
enum Color2 {
  red,
  blue = 5,
  orange,
}
let r2: Color2 = Color2.red;
let b2: Color2 = Color2.blue;
let o2: Color2 = Color2.orange;
console.log(r2, b2, o2);

// 任意类型（any）
let num: any = 123;
num = "str";
num = false;
console.log(num);

// 任意类型的用处
// let oBox: any = document.getElementById("box");
// oBox.style.color = "red";

//   null 和 undefined其他（never类型）

// let  num11: number;
// console.log(num11)  // 输出 undefined  报错

let num2: undefined;
console.log(num2); //  输入undefined  // 正确

// 定义未赋值undefined
let num3: number | undefined;
console.log(num3);

// null
let num4: null;
num4 = null;
console.log(num4, 122);

// 一个元素可能是number类型 可能是null 可能是undefined

let num5: number | undefined | null;

num5 = 1234;
console.log(num5);

// void类型 表示没有任何类型，一般踊跃定义方法没有返回值
// es5定义方法

// 错误写法
// function run(): undefined{
//   console.log('run')
// }
// run()

//  正确写法
function run(): void {
  console.log("run");
}
run();

//  正确写法
function run2(): number {
  return 999;
}

run2();

// never类型：是其他类型（包括null和undefined） 的子类型，代表不会出现的值
// 这意味着声明never的变量只能被never类型所赋值

let a9: undefined;
a9 = undefined;

let b1: null;
b1 = null;

let v1: never;

v1 = (() => {
  throw new Error("错误啦");
})();

console.log(v1);
